import csv

def calculate_bmr(gender, age, height_cm, weight_kg):
    # 计算基础代谢率(BMR)的函数
    if gender not in ['女', '男']:
        raise ValueError("性别输入错误，必须为 '女' 或 '男'。")
    if age <= 0 or not isinstance(age, int):
        raise ValueError("年龄必须是正整数。")
    if height_cm <= 0 or not isinstance(height_cm, (int, float)):
        raise ValueError("身高必须是正数。")
    if weight_kg <= 0 or not isinstance(weight_kg, (int, float)):
        raise ValueError("体重必须是正数。")

    return 66 + (13.75 * weight_kg) + (5 * height_cm) - (6.75 * age) if gender == '男' else \
           655 + (9.6 * weight_kg) + (1.8 * height_cm) - (4.7 * age)

def get_user_input(prompt, cast_to_type, error_message):
    # 获取用户输入并进行类型转换和错误处理的函数
    while True:
        user_input = input(prompt).strip().lower()
        if user_input == 'x':
            print("您已选择退出程序。")
            return None
        try:
            return cast_to_type(user_input)
        except ValueError:
            print(error_message)

def get_gender_input():
    # 专门用于获取性别输入的函数
    while True:
        gender = input("请输入您的性别（女/男），输入x退出程序: ").strip().lower()
        if gender == 'x':
            print("您已选择退出程序。")
            return None
        elif gender not in ['女', '男']:
            print("性别输入错误，请重新输入 '女' 或 '男'。")
        else:
            return gender

def menu():
    # 主菜单模块
    while True:
        print("\n主菜单：")
        print("1. 计算基础代谢率(BMR)")
        print("2. 退出程序")
        print("3. 生成CSV文件表头")
        try:
            choice = input("请选择一个选项（1-3）: ")
            if choice in ['1', '2', '3']:
                return choice
            else:
                print("输入无效，请输入1、2或3。")
        except ValueError:
            print("无效的输入，请输入数字。")

def count():
    # BMR计算模块，优化为在任一项输入错误时停止
    gender = get_gender_input()
    if gender is None:
        return None

    age = get_user_input("请输入您的年龄（岁），输入x退出程序: ", int, "年龄输入错误，年龄必须是正整数。")
    if age is None:
        return None

    height_cm = get_user_input("请输入您的身高（厘米），输入x退出程序: ", float, "身高输入错误，身高必须是正数。")
    if height_cm is None:
        return None

    weight_kg = get_user_input("请输入您的体重（公斤），输入x退出程序: ", float, "体重输入错误，体重必须是正数。")
    if weight_kg is None:
        return None

    try:
        bmr = calculate_bmr(gender, age, height_cm, weight_kg)
        print(f"您的基础代谢率（BMR）是: {bmr:.2f} 卡路里/天")
        return [gender, age, height_cm, weight_kg, bmr]
    except ValueError as e:
        print(e)
        return None

def generate_csv_header():
    # 生成CSV文件表头的函数
    with open('bmr_data.csv', mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['性别', '年龄', '身高(cm)', '体重(kg)', 'BMR(卡路里/天)'])

def Write_to_CSV(data):
    # 将数据写入CSV文件的函数
    with open('bmr_data.csv', mode='a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(data)

def main():
    # 主函数，控制程序流程
    generate_csv_header()
    while True:
        option = menu()
        if option == '1':
            bmr_data = count()
            if bmr_data:
                Write_to_CSV(bmr_data)
                print("BMR数据已保存至CSV文件。")
        elif option == '2':
            print("感谢使用本程序，再见！")
            break
        elif option == '3':
            generate_csv_header()
        else:
            print("未识别的选项，请重新选择。")

if __name__ == "__main__":
    main()